package com.xnet.datahandler.common;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;

/**
* 分页组件
* @author 目田
* 2016年12月23日
*/
public class Page{
	
	public static final Integer DEFAULT_PAGE_SIZE = 10;
	//一页显示的记录数
	private Integer pageSize;
	//记录总数
	private int totalRows;
	//总页数
	private int totalPages;
	//当前页码
	private Integer pageNo;
	//起始行数
	private int startIndex;
	
	/**分页构造函数
	* @param sql 包含筛选条件的sql，但不包含分页相关约束，如mysql的limit
	* @param pageNo 当前页
	* @param pageSize 每页记录数
	* @param jTemplate JdbcTemplate实例
	*/
	public Page(){
		super();
	}
	
	public Page(Integer pageNo, Integer pageSize) {
		super();
		this.setPageNo(pageNo);
		this.setPageSize(pageSize);
	}
	
	public List<Map<String, Object>> query(String sql,Integer pageNo,Integer pageSize,JdbcTemplate jTemplate) {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("totalRows=").append(totalRows).append(",totalPages=");
		stringBuilder.append(totalPages).append(", pageNo=").append(pageNo);
		if(jTemplate == null){
		throw new IllegalArgumentException("Page.jTemplate is null");
		}else if(sql == null || sql.equals("")){
		throw new IllegalArgumentException("Page.sql is empty");
		}
		if(pageNo == null) pageNo = 1;
		if(pageSize == null) pageSize=10;
		
		//设置每页显示记录数
		setPageSize(pageSize);
		//设置要显示的页数
		setPageNo(pageNo);
		//计算总记录数
		StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
		totalSQL.append(sql);
		totalSQL.append(" ) totalTable ");
		//总记录数
		setTotalRows(jTemplate.queryForObject(totalSQL.toString(), Integer.class));
		//计算总页数
		setTotalPages();
		//计算起始行数
		setStartIndex();
		//使用mysql时直接使用limits
		StringBuffer paginationSQL = new StringBuffer();
		paginationSQL.append(sql);
		paginationSQL.append(" limit " + startIndex + "," + pageSize);
		return jTemplate.queryForList(paginationSQL.toString());
	}
	
	public Integer getPageNo() {
		return pageNo;
	}
	
	public void setPageNo(Integer pageNo) {
		if(pageNo == null) pageNo = 1;
		this.pageNo = pageNo;
	}
	
	public Integer getPageSize() {
		return pageSize;
	}
	
	public void setPageSize(Integer pageSize) {
		if(pageSize == null) pageSize = DEFAULT_PAGE_SIZE;
		this.pageSize = pageSize;
	}
	
	public int getTotalPages() {
		return totalPages;
	}
	
	//计算总页数
	public void setTotalPages() {
		if(totalRows % pageSize == 0){
			this.totalPages = totalRows / pageSize;
		}else{
			this.totalPages = (totalRows / pageSize) + 1;
		}
	}
	
	public int getTotalRows() {
		return totalRows;
	}
	
	public void setTotalRows(int totalRows) {
		this.totalRows = totalRows;
	}
	
	public int getStartIndex() {
		return startIndex;
	}
	
	public void setStartIndex() {
		this.startIndex = (pageNo - 1) * pageSize;
	}
	
}